package com.mayo.feaf;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.mayo.feaf.comun.BaseActivity;
import com.mayo.feaf.comun.ComunActivity;
import com.mayo.feaf.comun.ComunUtilidades;
import com.mayo.feaf.json.JSONParser;
import com.mayo.feaf.object.FestivalObject;
import com.mayo.feaf.object.MarcadorObject;
import com.tjerkw.slideexpandable.library.SlideExpandableListAdapter;

public class ListadoFestivalesActivity extends BaseActivity {

	private ListView listaFestivales;
	public ListAdapter adapter;
	public JSONParser jParser = new JSONParser();
	public static JSONArray festivales = null;
	public ProgressDialog pDialog;
	
	public final String TAG_SUCCESS = "success";
	public final String TAG_FESTIVALES = "festivales";
	public final String TAG_ID = "id";
	public final String TAG_NOMBRE = "nombre_festival";
	public final String TAG_FECHA_INI = "fecha_inicio_festival";
	public final String TAG_PERIODO = "periodo_festival";
	public final String TAG_DESC = "descripcion_festival";
	public final String TAG_TIPO = "tipo_festival";
	public final String TAG_AGRUPACION = "id_agrupacion";
	public final String TAG_MUNICIPIO = "nombre_municipio";
	public final String TAG_COMENTARIOS = "comentarios_festival";
	public final String TAG_LATITUD = "latitud";
	public final String TAG_LONGITUD = "longitud";
	
	private String comunidad;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.activity_listado_festivales);
		
		if (getIntent().getExtras() != null) {
			Bundle todosParametros = getIntent().getExtras();
			comunidad = todosParametros.getString("comunidad");
		}
		actionBar.setTitle(R.string.tit_listado_festivales);
		String nombreComunidad = ComunActivity.getComunidadFromId(Integer.parseInt(comunidad));
		actionBar.setSubtitle(nombreComunidad);
		actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE
				| ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP
				| ActionBar.DISPLAY_SHOW_CUSTOM);
		
		listaFestivales = (ListView) findViewById(R.id.listado_festivales);
		
		new LoadAllFestivales().execute(comunidad);
		
	  }
	
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            this.finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
	
	/**
	 * Background Async Task to Load all product by making HTTP Request
	 * */
	class LoadAllFestivales extends AsyncTask<String, String, String> {

		/**
		 * Before starting background thread Show Progress Dialog
		 * */
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			pDialog = new ProgressDialog(ListadoFestivalesActivity.this);
			pDialog.setMessage("Cargando el listado de festivales. Por favor espere...");
			pDialog.setIndeterminate(false);
			pDialog.setCancelable(false);
			pDialog.show();
		}

		/**
		 * getting All products from url
		 * */
		protected String doInBackground(String... args) {
			String error = "0";
			List<NameValuePair> params;
			JSONObject json = new JSONObject();
			try {
				params = new ArrayList<NameValuePair>();
				params.add(new BasicNameValuePair("comunidad", args[0]));
				json = jParser.makeHttpRequest(ComunUtilidades.URL_GET_FESTIVALES, "GET", params);
				Log.d("Todos los festivales: ", json.toString());
				int success = json.getInt(TAG_SUCCESS);

				if (success == 1) {
					festivales = json.getJSONArray(TAG_FESTIVALES);
					adapter = new ListAdapter(festivales.length(),
							getApplicationContext());

					// looping through All Products
					for (int i = 0; i < festivales.length(); i++) {
						JSONObject c = festivales.getJSONObject(i);
						
						int id = c.getInt(TAG_ID);
						String nombre = c.getString(TAG_NOMBRE);
						String fechaIni = c.getString(TAG_FECHA_INI);
						String periodo = c.getString(TAG_PERIODO);
						String desc = c.getString(TAG_DESC);
						String tipo = c.getString(TAG_TIPO);
						String agr = c.getString(TAG_AGRUPACION);
						String mun = c.getString(TAG_MUNICIPIO);
						String comen = c.getString(TAG_COMENTARIOS);
						String lat = c.getString(TAG_LATITUD);
						String lon = c.getString(TAG_LONGITUD);
						
						FestivalObject fest = new FestivalObject(id, nombre, ComunActivity.formatDateString(fechaIni), 
								periodo, desc, tipo, agr, mun, comen, lat, lon);
						adapter.addItem(fest);
					}
				}
			} catch (JSONException e) {
				e.printStackTrace();
				error = "1";
			} catch (RuntimeException e) {
				e.printStackTrace();
				error = "1";
			}

			return error;
		}

		/**
		 * After completing background task Dismiss the progress dialog
		 * **/
		protected void onPostExecute(final String error) {
			// dismiss the dialog after getting all products
			pDialog.dismiss();
			// updating UI from Background Thread
			runOnUiThread(new Runnable() {
			 public void run() {
				if (error.equals("0")) {
//					listaFestivales.setAdapter(adapter);
					listaFestivales.setAdapter(
				            new SlideExpandableListAdapter(
				                adapter,
				                R.id.expandable_toggle_button,
				                R.id.expandable
				            )
				            );
				} else {
					Toast.makeText(getApplicationContext(), getString(R.string.error_conexion),
						Toast.LENGTH_LONG).show();
				}
			 }
			});

		}
	}
	
	/**
	 * Clase que controla el contenido y acciones de la lista de lugares.
	 * 
	 * @author masuar
	 * 
	 */
	public class ListAdapter extends BaseAdapter {
		public final ViewHolder holder = new ViewHolder();
		private ArrayList<FestivalObject> festivales = new ArrayList<FestivalObject>();
		private LayoutInflater inflater;
		private Context context;
		
		public ListAdapter(int size, Context context) {
			inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			this.context = context;
			inflater = LayoutInflater.from(context);
		}

		public void addItem(final FestivalObject festival) {
			festivales.add(festival);
			notifyDataSetChanged();
		}

		@Override
		public int getCount() {
			return festivales.size();
		}

		@Override
		public FestivalObject getItem(int position) {
			return festivales.get(position);
		}
		
		public void setItem(int position, FestivalObject festival) {
			festivales.set(position, festival);
		}

		@Override
		public long getItemId(int position) {
			return festivales.get(position).getId();
		}

		@Override
		public View getView(final int position, View convertView,
				ViewGroup parent) {
			convertView = inflater.inflate(R.layout.list_festivales, null);
			convertView.setClickable(true);
			
			holder.map = (ImageButton) convertView.findViewById(R.id.mapa);
			holder.share = (ImageButton) convertView.findViewById(R.id.share);

			// Obtenemos las referencias a los distintos controles
			holder.nombre = (TextView) convertView.findViewById(R.id.nombre);
			holder.ciudad = (TextView) convertView.findViewById(R.id.ciudad);
			holder.fecha = (TextView) convertView.findViewById(R.id.fecha);
			holder.descr = (TextView) convertView.findViewById(R.id.descripcion);
			holder.tipo = (TextView) convertView.findViewById(R.id.tipo);
			holder.coment = (TextView) convertView.findViewById(R.id.comentarios);
			
			holder.nombre.setText(festivales.get(position).getNombre());
			holder.ciudad.setText(festivales.get(position).getMunicipio());
			holder.fecha.setText(festivales.get(position).getFechaInicio());
			holder.descr.setText(festivales.get(position).getDescripcion());
			holder.tipo.setText(festivales.get(position).getTipo());
			holder.coment.setText(festivales.get(position).getComentarios());

//			Acciones de los botones que se expanden
			holder.share.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					ComunActivity.shareVia(getApplicationContext(), 
							getResources().getString(R.string.compartir_has_estado) 
							+ " '" 
							+ getItem(position).getNombre().toString()
							+ "'. " 
							+ getResources().getString(R.string.compartir_descarga));
				}
			});
			
			holder.map.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					FestivalObject festivales = getItem(position);
					MarcadorObject marcador = new MarcadorObject(festivales.getId(),
							festivales.getNombre(), 
							festivales.getMunicipio(), 
							festivales.getLatitud(), 
							festivales.getLongitud());
					Intent intent = new Intent(getApplicationContext(), MapaActivity.class);
					Bundle contenedor=new Bundle();
					contenedor.putParcelable("marcador", marcador);
					intent.putExtras(contenedor);
					startActivity(intent);
				}
			});
			convertView.setTag(holder);
			return convertView;
		}

			// This is called when doInBackground() is finished
			public void onPostExecute(final Bundle result) {
				onPostExecute(result);
				 runOnUiThread(new Runnable() {
					 public void run() {
						 //get picture saved in the map + set
					 }
				 });
			}
	}

	public static class ViewHolder {
		private TextView nombre;
		private TextView fecha;
		private TextView descr;
		private TextView tipo;
		private TextView ciudad;
		private TextView coment;
		private ImageButton map;
		private ImageButton share;
	}
	
}
